from django import http
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection

from meiduo_mall.settings.dev import logger


class ImageCodeView(View):
    '''图形验证码'''
    def get(self,request,uuid):
        '''

        :param request:请求对象
        :param uuid: 唯一标示图形验证码所属的用户
        :return: image/jpeg
        '''
        # 1.生成图片验证码
        from libs.captcha.captcha import captcha
        text,image = captcha.generate_captcha()

        # 2.保存图片验证码
        # 导入数据库
        from django_redis import get_redis_connection
        # 连接数据库,参数为配置的数据库名字
        redis_client = get_redis_connection('verify_image_code')
        redis_client.setex('img_%s' % uuid,300,text)

        # 3.相应图片验证码
        return http.HttpResponse(image,content_type='image/jpeg')

class SMSCodeView(View):
    '''短信验证码'''
    def get(self,request,mobile):
        '''

        :param request: 请求对象
        :param mobile: 手机号
        :return: JSON
        '''
        # 1.解析校验参数--mobile 不用校验
        uuid = request.GET.get('image_code_id')
        image_code = request.GET.get('image_code')

        # 2.校验图形验证码 如果正确 发送验证码, 不正确 直接返回
        # 2.1 根据uuid 去redis数据库查询 图片验证码
        image_redis_client = get_redis_connection('verify_image_code')
        redis_img_code = image_redis_client.get('img_%s' % uuid)

        # 判断服务器返回的验证
        if redis_img_code is None:
            return http.JsonResponse({'code':'4001','errmsg':'图形验证吗失效了'})

        # 如果有值 删除redis服务器上的图形验证码
        try:
            image_redis_client.delete('img_%s' % uuid)
        except Exception as e:
            logger.error(e)

        # 2.2 和前端传过来的进行做对比
        # 千万注意: 在redis取出来的是 bytes 类型不能直接做对比 decode()
        if image_code.lower() != redis_img_code.decode().lower():
            return http.JsonResponse({'code': "4001", 'errmsg': '输入图形验证码有误'})

        # 3.生成短信验证码,redis-存储
        from random import randint
        sms_code = "%06d" % randint(0, 999999)
        sms_redis_client = get_redis_connection('sms_code')
        sms_redis_client.setex('sms_%s' % mobile,300,sms_code)

        # 避免用户频繁发送短信验证码
        # 1.提取、校验send_flag
        send_flag = sms_redis_client.get('send_flag_%s' % mobile)
        if send_flag:
            return http.HttpResponseForbidden('短信发送太频繁！')
        # 2.重新写入send_flag

        # 优化 -- 管道操作
        # 实例化
        pipeline = sms_redis_client.pipeline()

        # 将任务添加到管道
        pipeline.setex('send_flag_%s' % mobile, 300, 1)

        # 保存短信验证码
        pipeline.setex('sms_%s' % mobile, 60, sms_code)

        # 执行管道
        pipeline.execute()

        # 4.让第三方 容联云-给手机号-发送短信
        from libs.yuntongxun.sms import CCP
        #                        手机号     验证码  过期时间5分钟 ,类型默认1
        CCP().send_template_sms(mobile,[sms_code,5],1)
        print("当前验证码是:", sms_code)

        # 5.告诉前端短信发送完毕
        return http.JsonResponse({'code': '0', 'errmsg': '发送短信成功'})


